#include "ManagedBlasProvider.h"

logical SmartMathLibrary::Blas::Engine::ManagedBlasProvider::lsame_(char *ca, char
  *cb)
{
  /*  -- LAPACK auxiliary routine (version 3.1) --   
  Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..   
  November 2006   


  Purpose   
  =======   

  LSAME returns .TRUE. if CA is the same letter as CB regardless of   
  case.   

  Arguments   
  =========   

  CA      (input) CHARACTER*1   

  CB      (input) CHARACTER*1   
  CA and CB specify the single characters to be compared.   

  =====================================================================   


  Test if the characters are equal */
  /* System generated locals */
  logical ret_val;
  /* Local variables */
  static integer inta, intb, zcode;


  ret_val = *(unsigned char*)ca == *(unsigned char*)cb;
  if (ret_val)
  {
    return ret_val;
  }

  /*     Now test for equivalence if both characters are alphabetic. */

  zcode = 'Z';

  /*     Use 'Z' rather than 'A' so that ASCII can be detected on Prime   
  machines, on which ICHAR returns a value with bit 8 set.   
  ICHAR('A') on Prime machines returns 193 which is the same as   
  ICHAR('A') on an EBCDIC machine. */

  inta = *(unsigned char*)ca;
  intb = *(unsigned char*)cb;

  if (zcode == 90 || zcode == 122)
  {

    /*        ASCII is assumed - ZCODE is the ASCII code of either lower or   
    upper case 'Z'. */

    if (inta >= 97 && inta <= 122)
    {
      inta +=  - 32;
    }
    if (intb >= 97 && intb <= 122)
    {
      intb +=  - 32;
    }

  }
  else if (zcode == 233 || zcode == 169)
  {

    /*        EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or   
    upper case 'Z'. */

    if (inta >= 129 && inta <= 137 || inta >= 145 && inta <= 153 || inta >= 162
      && inta <= 169)
    {
      inta += 64;
    }
    if (intb >= 129 && intb <= 137 || intb >= 145 && intb <= 153 || intb >= 162
      && intb <= 169)
    {
      intb += 64;
    }

  }
  else if (zcode == 218 || zcode == 250)
  {

    /*        ASCII is assumed, on Prime machines - ZCODE is the ASCII code   
    plus 128 of either lower or upper case 'Z'. */

    if (inta >= 225 && inta <= 250)
    {
      inta +=  - 32;
    }
    if (intb >= 225 && intb <= 250)
    {
      intb +=  - 32;
    }
  }
  ret_val = inta == intb;

  /*     RETURN   

  End of LSAME */

  return ret_val;
} /* lsame_ */
